home *** CD-ROM | disk | FTP | other *** search
/ DOS Vuser Deluxe 2003 October / DOS Vuser Deluxe 2003 Oct - Disc 1.iso / FREE / INTERNET / iria107a.lzh / script / mimetools.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2000-11-17  |  9KB  |  238 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.0)
  3.  
  4. '''Various tools used by MIME-reading or MIME-writing programs.'''
  5. import os
  6. import rfc822
  7. import string
  8. import tempfile
  9.  
  10. class Message(rfc822.Message):
  11.     '''A derived class of rfc822.Message that knows about MIME headers and
  12. \tcontains some hooks for decoding encoded and multipart messages.'''
  13.     
  14.     def __init__(self, fp, seekable = 1):
  15.         rfc822.Message.__init__(self, fp, seekable)
  16.         self.encodingheader = self.getheader('content-transfer-encoding')
  17.         self.typeheader = self.getheader('content-type')
  18.         self.parsetype()
  19.         self.parseplist()
  20.  
  21.     
  22.     def parsetype(self):
  23.         str = self.typeheader
  24.         if str == None:
  25.             str = 'text/plain'
  26.         
  27.         if ';' in str:
  28.             i = string.index(str, ';')
  29.             self.plisttext = str[i:]
  30.             str = str[:i]
  31.         else:
  32.             self.plisttext = ''
  33.         fields = string.splitfields(str, '/')
  34.         for i in range(len(fields)):
  35.             fields[i] = string.lower(string.strip(fields[i]))
  36.         
  37.         self.type = string.joinfields(fields, '/')
  38.         self.maintype = fields[0]
  39.         self.subtype = string.joinfields(fields[1:], '/')
  40.  
  41.     
  42.     def parseplist(self):
  43.         str = self.plisttext
  44.         self.plist = []
  45.         while str[:1] == ';':
  46.             str = str[1:]
  47.             if ';' in str:
  48.                 end = string.index(str, ';')
  49.             else:
  50.                 end = len(str)
  51.             f = str[:end]
  52.             if '=' in f:
  53.                 i = string.index(f, '=')
  54.                 f = string.lower(string.strip(f[:i])) + '=' + string.strip(f[i + 1:])
  55.             
  56.             self.plist.append(string.strip(f))
  57.             str = str[end:]
  58.  
  59.     
  60.     def getplist(self):
  61.         return self.plist
  62.  
  63.     
  64.     def getparam(self, name):
  65.         name = string.lower(name) + '='
  66.         n = len(name)
  67.         for p in self.plist:
  68.             pass
  69.         
  70.         return None
  71.  
  72.     
  73.     def getparamnames(self):
  74.         result = []
  75.         for p in self.plist:
  76.             i = string.find(p, '=')
  77.         
  78.         return result
  79.  
  80.     
  81.     def getencoding(self):
  82.         if self.encodingheader == None:
  83.             return '7bit'
  84.         
  85.         return string.lower(self.encodingheader)
  86.  
  87.     
  88.     def gettype(self):
  89.         return self.type
  90.  
  91.     
  92.     def getmaintype(self):
  93.         return self.maintype
  94.  
  95.     
  96.     def getsubtype(self):
  97.         return self.subtype
  98.  
  99.  
  100. _prefix = None
  101.  
  102. def choose_boundary():
  103.     """Return a random string usable as a multipart boundary.
  104. \tThe method used is so that it is *very* unlikely that the same
  105. \tstring of characters will every occur again in the Universe,
  106. \tso the caller needn't check the data it is packing for the
  107. \toccurrence of the boundary.
  108.  
  109. \tThe boundary contains dots so you have to quote it in the header."""
  110.     global _prefix
  111.     import time
  112.     import random
  113.     if _prefix == None:
  114.         import socket
  115.         import os
  116.         hostid = socket.gethostbyname(socket.gethostname())
  117.         
  118.         try:
  119.             uid = `os.getuid()`
  120.         except:
  121.             uid = '1'
  122.  
  123.         
  124.         try:
  125.             pid = `os.getpid()`
  126.         except:
  127.             pid = '1'
  128.  
  129.         _prefix = hostid + '.' + uid + '.' + pid
  130.     
  131.     timestamp = '%.3f' % time.time()
  132.     seed = `random.randint(0, 32767)`
  133.     return _prefix + '.' + timestamp + '.' + seed
  134.  
  135.  
  136. def decode(input, output, encoding):
  137.     '''Decode common content-transfer-encodings (base64, quopri, uuencode).'''
  138.     if encoding == 'base64':
  139.         import base64
  140.         return base64.decode(input, output)
  141.     
  142.     if encoding == 'quoted-printable':
  143.         import quopri
  144.         return quopri.decode(input, output)
  145.     
  146.     if encoding in ('uuencode', 'x-uuencode', 'uue', 'x-uue'):
  147.         import uu
  148.         return uu.decode(input, output)
  149.     
  150.     if encoding in ('7bit', '8bit'):
  151.         return output.write(input.read())
  152.     
  153.     if decodetab.has_key(encoding):
  154.         pipethrough(input, decodetab[encoding], output)
  155.     else:
  156.         raise ValueError, 'unknown Content-Transfer-Encoding: %s' % encoding
  157.  
  158.  
  159. def encode(input, output, encoding):
  160.     '''Encode common content-transfer-encodings (base64, quopri, uuencode).'''
  161.     if encoding == 'base64':
  162.         import base64
  163.         return base64.encode(input, output)
  164.     
  165.     if encoding == 'quoted-printable':
  166.         import quopri
  167.         return quopri.encode(input, output, 0)
  168.     
  169.     if encoding in ('uuencode', 'x-uuencode', 'uue', 'x-uue'):
  170.         import uu
  171.         return uu.encode(input, output)
  172.     
  173.     if encoding in ('7bit', '8bit'):
  174.         return output.write(input.read())
  175.     
  176.     if encodetab.has_key(encoding):
  177.         pipethrough(input, encodetab[encoding], output)
  178.     else:
  179.         raise ValueError, 'unknown Content-Transfer-Encoding: %s' % encoding
  180.  
  181. uudecode_pipe = '(\nTEMP=/tmp/@uu.$$\nsed "s%^begin [0-7][0-7]* .*%begin 600 $TEMP%" | uudecode\ncat $TEMP\nrm $TEMP\n)'
  182. decodetab = {
  183.     'uuencode': uudecode_pipe,
  184.     'x-uuencode': uudecode_pipe,
  185.     'uue': uudecode_pipe,
  186.     'x-uue': uudecode_pipe,
  187.     'quoted-printable': 'mmencode -u -q',
  188.     'base64': 'mmencode -u -b' }
  189. encodetab = {
  190.     'x-uuencode': 'uuencode tempfile',
  191.     'uuencode': 'uuencode tempfile',
  192.     'x-uue': 'uuencode tempfile',
  193.     'uue': 'uuencode tempfile',
  194.     'quoted-printable': 'mmencode -q',
  195.     'base64': 'mmencode -b' }
  196.  
  197. def pipeto(input, command):
  198.     pipe = os.popen(command, 'w')
  199.     copyliteral(input, pipe)
  200.     pipe.close()
  201.  
  202.  
  203. def pipethrough(input, command, output):
  204.     tempname = tempfile.mktemp()
  205.     
  206.     try:
  207.         temp = open(tempname, 'w')
  208.     except IOError:
  209.         print '*** Cannot create temp file', `tempname`
  210.         return None
  211.  
  212.     copyliteral(input, temp)
  213.     temp.close()
  214.     pipe = os.popen(command + ' <' + tempname, 'r')
  215.     copybinary(pipe, output)
  216.     pipe.close()
  217.     os.unlink(tempname)
  218.  
  219.  
  220. def copyliteral(input, output):
  221.     while 1:
  222.         line = input.readline()
  223.         if not line:
  224.             break
  225.         
  226.         output.write(line)
  227.  
  228.  
  229. def copybinary(input, output):
  230.     BUFSIZE = 8192
  231.     while 1:
  232.         line = input.read(BUFSIZE)
  233.         if not line:
  234.             break
  235.         
  236.         output.write(line)
  237.  
  238.